package Spring5.第二章.demo2_3_单例模式;

/**
 * 静态内部类方式
 * 这种形式兼顾饿汉式单例模式的内存浪费问题和synchronized的性能问题
 * 内部类一定要在方法调用前初始化，巧妙的避免了线程问题
 */
public class LazyInnerClassSingleton {
    // 使用这种形式，默认会先加载内部类
    // 如果没使用，内部类是不会加载的
    private LazyInnerClassSingleton(){
        // 由于反射会破坏单例，所以加了以下代码
        if (LazyHolder.LAZY != null) {
            throw new RuntimeException("不允许创建多个实例");
        }
    }

    // 每一个关键字都不是多余的，static是为了让单例的空间共享，final保证这个方法不会被重写，
    public static final LazyInnerClassSingleton getInstance() {
        // 在返回结果前一定会先加载内部类
        return LazyHolder.LAZY;
    }

    /**
     * 默认不加载
     */
    public static class LazyHolder {
        private static final LazyInnerClassSingleton LAZY = new LazyInnerClassSingleton();
    }

}
